package Vista;
import java.awt.*;
import java.awt.event.*;
import java.util.Iterator;
import java.util.List;
import java.util.Observable;
import java.util.Observer;
import Modelo.*;
import Controlador.*;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class Ventana extends JFrame implements Observer, MouseMotionListener{
	
	private Terreno terreno;
	private Object [][] bloques;
	private List <Pooglin> pooglins;
	private Habilidad habilidad;
	private Dimension dimensionVentana;
	private Dimension dimensionBoton;
	private Font fuenteBoton;
	private Panel panelBotones;
	private VistaReloj reloj;

	private JButton botonHabilidadTaladro = new JButton("Taladro"); 
	private JButton botonHabilidadRayoLaser = new JButton("RayoLaser");
	private JButton botonHabilidadCongelamiento = new JButton("Congelamiento"); 
	private JButton botonHabilidadPlatilloVolador = new JButton("Platillo Volador");
	private JButton botonHabilidadTunelElectroMagnetico = new JButton("Tunel");
	private JButton botonHabilidadTeletransportacion = new JButton("Teletransportacion");
	private JButton botonSalir = new JButton("Salir");
	private JButton botonGuardar = new JButton("Guardar");
	private JButton botonRecuperar = new JButton("Recuperar");
	private JButton botonPausar = new JButton("Pause");
	private JButton botonPlay = new JButton("Play");


	private Controlador controlador;	
	
	public Ventana(Terreno terreno,List <Pooglin> pooglins,Controlador controlador){
       
		super("Los Pooglins"); 
        this.controlador=controlador;
		this.bloques = (Object[][]) terreno.getBloques();
		this.pooglins = pooglins;
		this.terreno = terreno;
		setPreferredSize(this.dimensionVentana);
		setSize(terreno.getDimensionX()*20-10,terreno.getDimensionY()*30+20);
		setResizable(false);
		setLocationRelativeTo(null);
		addMouseListener(new AdaptadorMouse(this));
		addMouseMotionListener(this);		
		this.terreno.addObserver(this);
		panelBotones = new Panel();
		this.add("South", panelBotones);

		reloj = new VistaReloj(panelBotones,this.terreno.getPlaneta());
		reloj.mostrarReloj();
		setBotones();		

	}	

	public void update (Graphics g){
		paint(g);
	}
	
	public Reloj getReloj (){
		return this.reloj.getCronometro();
	}
	
	private void setBotones (){
		
		this.fuenteBoton = new Font( "Arial", Font.BOLD, 11 );		
		this.dimensionBoton= new Dimension(120, 30);
		panelBotones.setPreferredSize(new Dimension(300,100));
		JLabel habilidades = new JLabel("");
		botonHabilidadTaladro.add("Center",habilidades);
		
		
		panelBotones.add(botonHabilidadTaladro);  
		panelBotones.add(botonHabilidadRayoLaser); 
		panelBotones.add(botonHabilidadCongelamiento);
		panelBotones.add(botonHabilidadPlatilloVolador);
		panelBotones.add(botonHabilidadTunelElectroMagnetico);
		panelBotones.add(botonHabilidadTeletransportacion);
		panelBotones.add(botonSalir);
		panelBotones.add(botonGuardar);
		panelBotones.add(botonRecuperar);
		panelBotones.add(botonPausar);
		panelBotones.add(botonPlay);

		botonHabilidadTaladro.addActionListener(controlador.getListenerBotonTaladro());
		botonHabilidadRayoLaser.addActionListener(controlador.getListenerBotonRayoLaser());	
		botonHabilidadCongelamiento.addActionListener(controlador.getListenerBotonCongelamiento());
		botonHabilidadPlatilloVolador.addActionListener(controlador.getListenerBotonPlatilloVolador());
		botonHabilidadTunelElectroMagnetico.addActionListener(controlador.getListenerBotonTunelElectroMagnetico());
		botonHabilidadTeletransportacion.addActionListener(controlador.getListenerBotonTeletransportacion());
		botonSalir.addActionListener(controlador.getListenerBotonSalir());
		botonGuardar.addActionListener(controlador.getListenerBotonGuardar());
		botonRecuperar.addActionListener(controlador.getListenerBotonRecuperar());
		botonPausar.addActionListener(controlador.getListenerBotonPausar());
		botonPlay.addActionListener(controlador.getListenerBotonPlay());
		
		botonHabilidadTeletransportacion.setPreferredSize(new Dimension(150,30));
		botonHabilidadTaladro.setPreferredSize(this.dimensionBoton);
		botonHabilidadRayoLaser.setPreferredSize(this.dimensionBoton);	
		botonHabilidadCongelamiento.setPreferredSize(this.dimensionBoton);
		botonHabilidadPlatilloVolador.setPreferredSize(this.dimensionBoton);
		botonHabilidadTunelElectroMagnetico.setPreferredSize(this.dimensionBoton);
		botonSalir.setPreferredSize(this.dimensionBoton);
		botonGuardar.setPreferredSize(this.dimensionBoton);
		botonRecuperar.setPreferredSize(this.dimensionBoton);
		botonPausar.setPreferredSize(this.dimensionBoton);
		botonPlay.setPreferredSize(this.dimensionBoton);		
		
		botonHabilidadTaladro.setFont(this.fuenteBoton);
		botonHabilidadRayoLaser.setFont(this.fuenteBoton);	
		botonHabilidadCongelamiento.setFont(this.fuenteBoton);
		botonHabilidadPlatilloVolador.setFont(this.fuenteBoton);
		botonHabilidadTunelElectroMagnetico.setFont(this.fuenteBoton);
		botonHabilidadTeletransportacion.setFont(this.fuenteBoton);		
		botonSalir.setFont(this.fuenteBoton);
		botonGuardar.setFont(this.fuenteBoton);
		botonRecuperar.setFont(this.fuenteBoton);
		botonPausar.setFont(this.fuenteBoton);
		botonPlay.setFont(this.fuenteBoton);

	}
	
	public synchronized void paint (Graphics g){
		
		g.translate(getInsets().left, getInsets().top);
		setBackground(Color.white);	
		VistaPooglin vistaPooglin = new VistaPooglin(this);
		VistaTerreno vistaTerreno = new VistaTerreno(this);
		vistaTerreno.pintarTerreno(terreno, bloques);
		vistaPooglin.pintarPooglin(this.pooglins);  
	}
       
	
	
	@Override
	public void mouseDragged(MouseEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseMoved(MouseEvent evt) {
		if(marcarPooglin(evt.getX(),evt.getY())==1)
			setCursor(Cursor.getPredefinedCursor(CROSSHAIR_CURSOR));
		else
			setCursor(Cursor.DEFAULT_CURSOR);				
		
	}
	
public int marcarPooglin(int x, int y) {    	
		
		for (int i=0;i<40;i++){
			for (int j=0;j<40;j++){
		    	Iterator<Pooglin> miIterador = this.pooglins.iterator();
				while (miIterador.hasNext()){
		    		Pooglin pooglin = (Pooglin) miIterador.next();
		    		Integer posicionX = pooglin.getPosicion().getPosicionX()*20+30;
		    		Integer posicionY = pooglin.getPosicion().getPosicionY()*20+80;
		    		if ((posicionX==x+i)&&(posicionY==y+j)){
						return 1;
		    		}
				}
			}
		}
		return -1;
	}
	
	public void find(int x, int y) {    	
		
		for (int i=0;i<40;i++){
			for (int j=0;j<40;j++){
		    	Iterator<Pooglin> miIterador = this.pooglins.iterator();
				while (miIterador.hasNext()){
		    		Pooglin pooglin = (Pooglin) miIterador.next();
		    		Integer posicionX = pooglin.getPosicion().getPosicionX()*20+30;
		    		Integer posicionY = pooglin.getPosicion().getPosicionY()*20+80;
		    		if ((posicionX==x+i)&&(posicionY==y+j)){
						pooglin.setHabilidad(this.habilidad);	
		    		}
				}
			}
		}
	}

	@Override
	public void update(Observable o, Object arg) {
		// TODO Auto-generated method stub
	}
	
	public Controlador getControlador() {		
		return this.controlador;		
	}
	
	public void setHabilidad (Habilidad habilidad){
		this.habilidad=habilidad;
	}

}
